4. 注入属性和依赖对象
4. 注入属性和依赖对象
工程结构

Spring Bean 容器类关系,如图:

- 新增加3个类,BeanReference(类引用)、PropertyValue(属性值)、PropertyValues(属性集合),分别用于类和其他类型属性填充操作。
- 另外改动的类主要是
AbstractAutowireCapableBeanFactory,在 createBean 中补全属性填充部分。
设计
鉴于属性填充是在 Bean 使用 newInstance 或者 Cglib
创建后,开始补全属性信息,那么就可以在类 AbstractAutowireCapableBeanFactory 的 createBean 方法中添加补全属性方法。

- 属性填充要在类实例化创建之后,也就是需要在
AbstractAutowireCapableBeanFactory的 createBean
方法中添加applyPropertyValues操作。 - 由于我们需要在创建Bean时候填充属性操作,那么就需要在 bean 定义 BeanDefinition 类中,添加 PropertyValues 信息。
- 另外是填充属性信息还包括了 Bean 的对象类型,也就是需要再定义一个 BeanReference,里面其实就是一个简单的 Bean
名称,在具体的实例化操作时进行递归创建和填充,与 Spring 源码实现一样。
实现
定义属性
源码详见: lqf.springframework.beans.PropertyValue、PropertyValue
- 这两个类的作用就是创建出一个用于传递类中属性信息的类,因为属性可能会有很多,所以还需要定义一个集合包装下。
Bean定义补全
源码详见: lqf.springframework.beans.factory.config.BeanDefinition
- 在 Bean 注册的过程中是需要传递 Bean 的信息,在之前的测试中都有所体现 new BeanDefinition(UserService.class,
propertyValues); - 所以为了把属性一定交给 Bean 定义,所以这里填充了 PropertyValues 属性,同时把两个构造函数做了一些简单的优化,避免后面 for
循环时还得判断属性填充是否为空。
Bean 属性填充
源码详见: lqf.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
- 主要包括三个方法:createBean、createBeanInstance、applyPropertyValues,这里我们主要关注 createBean 的方法中调用的
applyPropertyValues 方法。 - 在 applyPropertyValues 中,通过获取
beanDefinition.getPropertyValues()循环进行属性填充操作,如果遇到的是
BeanReference,那么就需要递归获取 Bean 实例,调用 getBean 方法。 - 当把依赖的 Bean 对象创建完成后,会递归回现在属性填充中。此处引入 hutool-all 依赖。
总结
- 把 AbstractAutowireCapableBeanFactory 类中的创建对象功能又做了扩充,依赖于是否有构造函数的实例化策略完成后,开始补充
Bean 属性信息。当遇到 Bean 属性为 Bean 对象时,需要递归处理。最后在属性填充时需要用到反射操作,也可以使用一些工具类处理。 - 每一个章节的功能点我们都在循序渐进的实现,这样可以让新人更好的接受关于 Spring 中的设计思路。
- 到这一章节关于 Bean 的创建操作就开发完成了,接下来需要整个框架的基础上完成资源属性的加载,需要去动 Xml 配置了,让我们这小框架越来越像Spring。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 iAuzre
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果
音乐天地